<?php

namespace Siese\EntityBundle\Form\EventListener;
 
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Doctrine\ORM\EntityRepository;
 
class AddMunicipiosFieldSubscriber implements EventSubscriberInterface
{
    private $propertyPathToMunicipio;
 
    public function __construct($propertyPathToMunicipio)
    {
        $this->propertyPathToMunicipio = $propertyPathToMunicipio;
    }
 
    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SET_DATA  => 'preSetData',
            FormEvents::PRE_SUBMIT    => 'preSubmit'
        );
    }
 
    private function addMunicipiosForm($form, $estado)
    {
        
        $formOptions = array(
            'class'         => 'SieseEntityBundle:CatMunicipios',
            'empty_value'   => 'Seleccione una Opción',
            'label'         => '3.Municipio',
            'attr'          => array(
                'class' => 'municipio_selector',
            ),
            'query_builder' => function (EntityRepository $repository) use ($estado) {
            
            
                $qb = $repository->createQueryBuilder('mun')
                                 ->where('mun.estado = :estado')
                                 ->setParameter('estado',$estado)
                ;
                

                return $qb;
            }
        );
 
        $form->add($this->propertyPathToMunicipio, 'entity', $formOptions);
    }
 
    public function addMunicipiosPreSubmitForm($form, $estado) {
        $formOptions = array(
            'class'         => 'SieseEntityBundle:CatMunicipios',
            'empty_value'   => 'Seleccione una Opción',
            'label'         => '3.Municipio',
            'attr'          => array(
                'class' => 'municipio_selector',
            ),
            'query_builder' => function (EntityRepository $repository) use ($estado) {
            
            
                $qb = $repository->createQueryBuilder('mun')
                ;
                

                return $qb;
            }
        );
 
        $form->add($this->propertyPathToMunicipio, 'entity', $formOptions);        
    }
    
    public function preSetData(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();
 
        if (null === $data) {
            return;
        }
 
        $accessor    = PropertyAccess::createPropertyAccessor();
 
        $municipio        = $accessor->getValue($data, $this->propertyPathToMunicipio);
        
        $estado_id = ($municipio) ? $municipio->getEstado()->getId() : null;

        $this->addMunicipiosForm($form, $estado_id);
    }
 
    public function preSubmit(FormEvent $event)
    {
        $data = $event->getData();
        $form = $event->getForm();
 
        $estado_id = array_key_exists('estado', $data) ? $data['estado'] : null;
 
        $this->addMunicipiosPreSubmitForm($form, $estado_id);
    }
}
